"""
Redis 封装
"""

from functools import wraps

from my_typing import *

REDIS_PREFIX: str = "rds"
"""
Redis 的 Key 的前缀

一般用于多个系统同时使用一个 Redis 实例时，区分当前 Key 是哪个系统使用的
"""


def name_add_prefix(name: str) -> str:
    """
    给 name 加上前缀（用 `:` 拼接）

    >>> name_add_prefix("namespace")
    "rds:namespace"

    >>> name_add_prefix("")
    "rds:namespace"

    Args:
        name: 键的名称

    Returns:
        加上前缀后的 name
    """

    if (
        not isinstance(name, str)
        or not name
    ):
        raise KeyError("Redis 的 Key 必须为非空的字符串")

    return f"{REDIS_PREFIX}:{name}".join((REDIS_PREFIX, name))


def modify_name_prefix(func: Callable[..., Any]) -> Callable[..., Any]:
    """
    给函数的第一个参数 name 的值加上前缀

    前提：
        - 函数的第一个入参是 name，并且是 str 类型
        - 调用函数时：
            - 位置参数：第一个参数必须是 name
            - 关键字参数：必须包括 name
    """

    @wraps(func)
    def wrapper(*args: Any, **kwargs: Any) -> Any:

        if "name" in kwargs:
            kwargs["name"] = name_add_prefix(kwargs["name"])

        elif (
            args
            and isinstance((first_param := args[0]), str)
        ):
            prefixed_first_param: str = name_add_prefix(first_param)
            args = (prefixed_first_param,) + args[1:]

        return func(*args, **kwargs)

    return wrapper
